package javajavado.dao;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.Collection;
 
import javajavado.clases.Usuario;


import javajavado.excepcion.DAOExcepcion; 
import javajavado.util.ConexionBD;

public class UsuarioDAO extends BaseDAO {

	public Collection<Usuario> buscarPorNombre(String idusuario)	
			throws DAOExcepcion {
		String query = "select nombre, materno, paterno, password, tipo, sexo, tipoDocumento, nroDocumento, celular, correoElectronico, centroFormacion from usuario where idusuario like ?";
		Collection<Usuario> lista = new ArrayList<Usuario>();
		Connection con = null;
		PreparedStatement stmt = null;
		ResultSet rs = null;
		try {
			con = ConexionBD.obtenerConexion();
			stmt = con.prepareStatement(query);
			stmt.setString(1, "%" + idusuario + "%");
			rs = stmt.executeQuery();
			
			while (rs.next()) {
				Usuario vo = new Usuario();
				vo.setNombre(rs.getString("nombre"));
				vo.setMaterno(rs.getString("materno")); 
				vo.setPaterno(rs.getString("paterno"));
				vo.setPassword(rs.getString("password"));
				vo.setTipo(rs.getString("tipo"));
				vo.setSexo(rs.getString("sexo"));
				vo.setTipoDocumento(rs.getString("tipoDocumento"));
				vo.setNroDocumento(rs.getString("nroDocumento"));
				vo.setCelular(rs.getString("celular"));
				vo.setCorreoElectronico(rs.getString("correoElectronico"));
			   //vo.setCentroFormacionIdCentroFormacion(rs.getInt("setCentroFormacionIdCentroFormacion"));
					
				lista.add(vo);
			}

			System.out.println("cantidad de registros en la buqueda"+lista.size());
		} catch (SQLException e) {
			System.err.println(e.getMessage());
			throw new DAOExcepcion(e.getMessage());
		} finally {
			this.cerrarResultSet(rs);
			this.cerrarStatement(stmt);
			this.cerrarConexion(con);
		}
		return lista;
	}

	public Usuario obtener(int idUsuario) throws DAOExcepcion {
		Usuario vo = new Usuario();
		Connection con = null;
		PreparedStatement stmt = null;
		ResultSet rs = null;
		try {
			String query = "select idusario, nombre, paterno, materno, password, tipo, sexo, tipoDocumento, nroDocumento, celular, correoElectronico, centroFormacionIdCentroFormacion from usuario where idusuario=?";
			con = ConexionBD.obtenerConexion();
			stmt = con.prepareStatement(query);
			stmt.setInt(1, idUsuario);
			rs = stmt.executeQuery();
			if (rs.next()) {
				vo.setIdUsuario(rs.getInt(1));
				vo.setNombre(rs.getString(2));
				vo.setPaterno(rs.getString(3));
				vo.setMaterno(rs.getString(4));
				vo.setPassword(rs.getString(5));
				vo.setTipo(rs.getString(6));
				vo.setSexo(rs.getString(7));
				vo.setTipoDocumento(rs.getString(8));
				vo.setNroDocumento(rs.getString(9));
				vo.setCelular(rs.getString(10));
				vo.setCorreoElectronico(rs.getString(11));
				vo.setCentroFormacionIdCentroFormacion(rs.getInt(12));
			}
		} catch (SQLException e) {
			System.err.println(e.getMessage());
			throw new DAOExcepcion(e.getMessage());
		} finally {
			this.cerrarResultSet(rs);
			this.cerrarStatement(stmt);
			this.cerrarConexion(con);
		}
		return vo;
	}

	public Usuario actualizar(Usuario vo) throws DAOExcepcion {
		String query = "update usuario set nombre=?, paterno=?, materno=?, password=?, tipo=?, sexo=?,tipoDocumento=?, nroDocumento=?, celular=?, correoElectronico=?, centroFormacionIdCentroFormacion=? where idUsuario=?"; //nombre de a tabla
		Connection con = null;
		PreparedStatement stmt = null;
		try {
			con = ConexionBD.obtenerConexion();
			stmt = con.prepareStatement(query);
			stmt.setString(1, vo.getNombre());
			stmt.setString(2, vo.getPaterno());
			stmt.setString(3, vo.getMaterno());
			stmt.setString(4, vo.getPassword());
			stmt.setString(5, vo.getTipo());
			stmt.setString(6, vo.getSexo());
			stmt.setString(7, vo.getTipoDocumento());
			stmt.setString(8, vo.getNroDocumento());
			stmt.setString(9, vo.getCelular());
			stmt.setString(10, vo.getCorreoElectronico());
			stmt.setInt(11, vo.getCentroFormacionIdCentroFormacion());
			int i = stmt.executeUpdate();
			if (i != 1) {
				throw new SQLException("No se pudo actualizar");
			}
		} catch (SQLException e) {
			System.err.println(e.getMessage());
			throw new DAOExcepcion(e.getMessage());
		} finally {
			this.cerrarStatement(stmt);
			this.cerrarConexion(con);
		}
		return vo;
	}

	public Usuario insertar(Usuario vo) throws DAOExcepcion {
		String query = "insert into usuario(nombre, materno, paterno, password, tipo, sexo, tipoDocumento, nroDocumento, celular, correoElectronico) values (?,?,?,?,?,?,?,?,?,?)";
		Connection con = null;
		PreparedStatement stmt = null;
		ResultSet rs = null;
		try {
			con = ConexionBD.obtenerConexion();
			stmt = con.prepareStatement(query);
			stmt.setString(1, vo.getNombre());
			stmt.setString(2, vo.getMaterno());
			stmt.setString(3, vo.getPaterno());
			stmt.setString(4, vo.getPassword());
			stmt.setString(5, vo.getTipo());
			stmt.setString(6, vo.getSexo());
			stmt.setString(7, vo.getTipoDocumento());
			stmt.setString(8, vo.getNroDocumento());
			stmt.setString(9, vo.getCelular());
			stmt.setString(10, vo.getCorreoElectronico());
			
			int i = stmt.executeUpdate();
			if (i != 1) {
				throw new SQLException("No se pudo insertar");
			}
			// Obtener el ultimo id
			int id = 0;
			query = "select last_insert_id()";
			stmt = con.prepareStatement(query);
			rs = stmt.executeQuery();
			if (rs.next()) {
				id = rs.getInt(1);
			}
			vo.setIdUsuario(id);

		} catch (SQLException e) {
			System.err.println(e.getMessage());
			throw new DAOExcepcion(e.getMessage());
		} finally {
			this.cerrarResultSet(rs);
			this.cerrarStatement(stmt);
			this.cerrarConexion(con);
		}
		return vo;
	}
	public void eliminar(int idUsuario) throws DAOExcepcion {
		String query = "delete from usuario WHERE idUsuario=?"; // delete from de la tabla
		Connection con = null;
		PreparedStatement stmt = null;
		try {
			con = ConexionBD.obtenerConexion();
			stmt = con.prepareStatement(query);
			stmt.setInt(1, idUsuario);
			int i = stmt.executeUpdate();
			if (i != 1) {
				throw new SQLException("No se pudo eliminar");
			}
		} catch (SQLException e) {
			System.err.println(e.getMessage());
			throw new DAOExcepcion(e.getMessage());
		} finally {
			this.cerrarStatement(stmt);
			this.cerrarConexion(con);
		}
	}
	public Collection<Usuario> listar() throws DAOExcepcion {
		Collection<Usuario> c = new ArrayList<Usuario>();
		Connection con = null;
		PreparedStatement stmt = null;
		ResultSet rs = null;
		try {
			con = ConexionBD.obtenerConexion();
			String query = "select IdUsuario, nombre, materno, paterno, password, tipo, sexo, tipo_Documento, nro_Documento, celular, correoElectronico from Usuario order by nombre";//, centroFormacion
			stmt = con.prepareStatement(query);
			rs = stmt.executeQuery();
			while (rs.next()) {
				Usuario vo = new Usuario();
				vo.setIdUsuario(rs.getInt("idUsuario"));
				vo.setNombre(rs.getString("nombre"));
				vo.setMaterno(rs.getString("materno"));
				vo.setPaterno(rs.getString("paterno"));
				vo.setPassword(rs.getString("password"));
				vo.setTipo(rs.getString("tipo"));
				vo.setSexo(rs.getString("sexo"));
				vo.setTipoDocumento(rs.getString("tipo_Documento"));
				vo.setNroDocumento(rs.getString("nro_Documento"));
				vo.setCelular(rs.getString("celular"));
				vo.setCorreoElectronico(rs.getString("correoElectronico"));
				//vo.setCentroFormacion(rs.getString("centroFormacion"));
				
				c.add(vo);
			}

		} catch (SQLException e) {
			System.err.println(e.getMessage());
			throw new DAOExcepcion(e.getMessage());
		} finally {
			this.cerrarResultSet(rs);
			this.cerrarStatement(stmt);
			this.cerrarConexion(con);
		}
		return c;
	}

		} 

